package br.com.JZSolution.domineduplex.rede;

import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;

import br.com.JZSolution.domineduplex.DomineDuplex;

public class ControladorDeServidor {
	 private static ServerSocket serverSocket;
	 private static ControladorDeServidor instance;
	 private static boolean conectado = false;
	 private static boolean conectando = false;
	 
	 private ControladorDeServidor(int portaServidor) throws IOException{
		 try{
			 //Iniciando o servidor
			 serverSocket = new ServerSocket(portaServidor);
			 System.out.println("Controlador de servidor iniciado na Porta = "+portaServidor);
			 conectado = true;
			 conectando = false;
			 //Esperando novas conexões
			 try {
				 while(true) {
					 // Bloqueia ate receber uma conexao
					 Socket socketCliente = serverSocket.accept();
					 System.out.println("Recebeu um cliente : "+socketCliente.getInetAddress());
					 new Destinatario(socketCliente);//Thread
				 }   
			 }catch (Exception e) {
				 serverSocket.close();
			 }
			 instance = this;
			 
		 }catch (BindException e) {
			conectando = false;
			throw new BindException();
		 }catch (IOException e) {
			 conectando = false;
			 throw new IOException();
		}
	 }
	
	public static ControladorDeServidor getInstance() throws IOException{
		if (instance == null)
			new ControladorDeServidor(DomineDuplex.getInstance().getPortaDeRecepcao());
		return instance;
	}
		
	public static void desconectar(){
		try{
			conectado = false;
			serverSocket.close();
			System.out.println("Destinatario desconectado.");
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void Conectar() throws IOException{
		conectando = true;
		instance = new ControladorDeServidor(DomineDuplex.getInstance().getPortaDeRecepcao());
	}
	
	public static boolean isConectado() {
		return conectado;
	}
	public static boolean isConectando() {
		return conectando;
	}
	public static void setConectando(boolean conectando) {
		ControladorDeServidor.conectando = conectando;
	}
}
